﻿using Reserva_de_Vuelo.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using Reserva_de_Vuelo.VuelosService;
using Reserva_de_Vuelo.ReservaWS;
using System.ServiceModel;

namespace Reserva_de_Vuelo.Controllers
{
    public class HomeController : Controller
    {
        public ActionResult Index()
        {
            ViewBag.Message = "ASP.NET MVC";

            return View();
        }

        public ActionResult About()
        {
            return View();
        }

        public ActionResult Resultados(BusquedaVuelo pObjBusquedaVuelo)
        {
            if (!ModelState.IsValid)
            {
                return View("Index", pObjBusquedaVuelo);
            }
            else
            {
                bool bolContinuar = true;
                if (pObjBusquedaVuelo.EsIdaVuelta)
                {
                    if (string.IsNullOrEmpty(pObjBusquedaVuelo.FechaRetorno))
                    {
                        ModelState.AddModelError("IngreseFechaRetorno", "Ingrese la fecha de retorno.");
                        bolContinuar = false;
                    }
                    else if (!IsDate(pObjBusquedaVuelo.FechaSalida))
                    {
                        ModelState.AddModelError("IngreseFechaRetorno", "Fecha de salida incorrecta.");
                        bolContinuar = false;
                    }
                    else if (!IsDate(pObjBusquedaVuelo.FechaRetorno))
                    {
                        ModelState.AddModelError("IngreseFechaRetorno", "Fecha de retorno incorrecta.");
                        bolContinuar = false;
                    }
                    else
                    {
                        if (DateTime.Parse(pObjBusquedaVuelo.FechaSalida) > DateTime.Parse(pObjBusquedaVuelo.FechaRetorno))
                        {
                            ModelState.AddModelError("FechaRetornoMayorFechaSalida", "La fecha de retorno debe ser mayor a la fecha de salida.");
                            bolContinuar = false;
                        }
                    }
                }
                if (bolContinuar)
                {
                    try
                    {
                        Reserva_de_Vuelo.VuelosService.ProveedorVuelosServiceClient objVuelosServiceClient = new Reserva_de_Vuelo.VuelosService.ProveedorVuelosServiceClient();
                        DateTime datFechaSalida = DateTime.Parse(pObjBusquedaVuelo.FechaSalida);
                        Nullable<DateTime> datFechaRetorno = null;
                        if (!String.IsNullOrEmpty(pObjBusquedaVuelo.FechaRetorno))
                        {
                            datFechaRetorno = DateTime.Parse(pObjBusquedaVuelo.FechaRetorno);
                        }

                        String strTipoVuelo = Util.Constantes.STR_ID_TIPO_VUELO_SOLO_IDA;
                        if (pObjBusquedaVuelo.EsIdaVuelta)
                        {
                            strTipoVuelo = Util.Constantes.STR_ID_TIPO_VUELO_IDA_Y_VUELTA;
                        }

                        List<VuelosService.Vuelo> lstDisponibilidadVuelos = new List<VuelosService.Vuelo>(objVuelosServiceClient.Obtener_Vuelos(pObjBusquedaVuelo.Origen, pObjBusquedaVuelo.Destino, datFechaSalida, datFechaRetorno, pObjBusquedaVuelo.Adultos, pObjBusquedaVuelo.Ninos, pObjBusquedaVuelo.Infantes, strTipoVuelo));

                        Session["LISTA_VUELOS"] = lstDisponibilidadVuelos;
                        Session["BUSQUEDA"] = pObjBusquedaVuelo;
                        //ViewBag.lstDisponibilidadVuelos = lstDisponibilidadVuelos;
                        return View();

                    }
                    catch (System.ServiceModel.FaultException ex)
                    {
                        ModelState.AddModelError("CiudadNoExiste", ex.Message);
                        return View("Index", pObjBusquedaVuelo);
                    }
                }
                else
                {
                    return View("Index", pObjBusquedaVuelo);
                }
            }
        }

        public ActionResult SeleccionarVuelo(FormCollection objFormCollection)
        {
            int intIndexVuelo = 0;
            int intIndexSalida = -1;
            int intIndexRetorno = -1;

            foreach (String key in objFormCollection.Keys)
            {
                if (key.Contains("Salida"))
                {
                    intIndexSalida = int.Parse(objFormCollection[key.ToString()]);
                }
                else if (key.Contains("Retorno"))
                {
                    if (!String.IsNullOrEmpty(objFormCollection[key.ToString()])) {
                        intIndexRetorno = int.Parse(objFormCollection[key.ToString()]);                    
                    }
                }
                else if (key.Contains("IndexVuelo"))
                {
                    intIndexVuelo = int.Parse(objFormCollection[key.ToString()]);
                }
            }
            List<VuelosService.Vuelo> lstDisponibilidadVuelos = (List<VuelosService.Vuelo>)Session["LISTA_VUELOS"];

            Reserva_de_Vuelo.VuelosService.Vuelo objVueloSeleccionado = lstDisponibilidadVuelos[intIndexVuelo - 1];
            
            Reserva_de_Vuelo.VuelosService.HorarioVuelo objHorarioSalida = objVueloSeleccionado.HorariosVuelo[intIndexSalida];

            List<SegmentoVuelo> lstSegmentos = new List<SegmentoVuelo>();

            SegmentoVuelo objSegmentoVueloSalida = new SegmentoVuelo();
            objSegmentoVueloSalida.FechaSalida = objHorarioSalida.FechaSalida;
            objSegmentoVueloSalida.FechaLlegada = objHorarioSalida.FechaLlegada;
            objSegmentoVueloSalida.CodigoOrigen = objHorarioSalida.CodigoOrigen;
            objSegmentoVueloSalida.NombreOrigen = objHorarioSalida.NombreOrigen;
            objSegmentoVueloSalida.CodigoDestino = objHorarioSalida.CodigoDestino;
            objSegmentoVueloSalida.NombreDestino = objHorarioSalida.NombreDestino;
            objSegmentoVueloSalida.CodigoLineaAerea = objHorarioSalida.CodigoLineaAerea;
            objSegmentoVueloSalida.NombreLineaAerea = objHorarioSalida.NombreLineaAerea;
            lstSegmentos.Add(objSegmentoVueloSalida);

            Session["VUELO_SELECCIONADO"] = objVueloSeleccionado;
            Session["HORARIO_SALIDA"] = objHorarioSalida;

            if (intIndexRetorno >= 0)
            {
                Reserva_de_Vuelo.VuelosService.HorarioVuelo objHorarioRetorno = objVueloSeleccionado.HorariosVuelo[intIndexRetorno - 1];
                Session["HORARIO_RETORNO"] = objHorarioRetorno;

                SegmentoVuelo objSegmentoVueloRetorno = new SegmentoVuelo();
                objSegmentoVueloRetorno.FechaSalida = objHorarioSalida.FechaSalida;
                objSegmentoVueloRetorno.FechaLlegada = objHorarioSalida.FechaLlegada;
                objSegmentoVueloRetorno.CodigoOrigen = objHorarioSalida.CodigoOrigen;
                objSegmentoVueloRetorno.NombreOrigen = objHorarioSalida.NombreOrigen;
                objSegmentoVueloRetorno.CodigoDestino = objHorarioSalida.CodigoDestino;
                objSegmentoVueloRetorno.NombreDestino = objHorarioSalida.NombreDestino;
                objSegmentoVueloRetorno.CodigoLineaAerea = objHorarioSalida.CodigoLineaAerea;
                objSegmentoVueloRetorno.NombreLineaAerea = objHorarioSalida.NombreLineaAerea;
                lstSegmentos.Add(objSegmentoVueloRetorno);
            }

            ReservaVuelo objReservaVuelo = new ReservaVuelo();
            BusquedaVuelo objBusquedaVuelo = (BusquedaVuelo)Session["BUSQUEDA"];

            objReservaVuelo.CantAdultos = objBusquedaVuelo.Adultos;
            objReservaVuelo.CantNinos = objBusquedaVuelo.Ninos;
            objReservaVuelo.CantInfantes = objBusquedaVuelo.Infantes;

            decimal decTotalPagar = 0;
            List<ReservaPasajero> lstPasajeros = new List<ReservaPasajero>();

            for (int intX = 1; intX <= objBusquedaVuelo.Adultos; intX++) {
                ReservaPasajero objReservaPasajero = new ReservaPasajero();
                objReservaPasajero.PAX_TIPO = "A";
                objReservaPasajero.TARIFA = objVueloSeleccionado.TarifaAdulto;
                objReservaPasajero.IMPUESTOS = objVueloSeleccionado.Impuestos;
                decTotalPagar += objReservaPasajero.TARIFA + objReservaPasajero.IMPUESTOS;
                lstPasajeros.Add(objReservaPasajero);
            }
            for (int intX = 1; intX <= objBusquedaVuelo.Ninos; intX++)
            {
                ReservaPasajero objReservaPasajero = new ReservaPasajero();
                objReservaPasajero.PAX_TIPO = "N";
                objReservaPasajero.TARIFA = objVueloSeleccionado.TarifaNino;
                objReservaPasajero.IMPUESTOS = objVueloSeleccionado.Impuestos;
                decTotalPagar += objReservaPasajero.TARIFA + objReservaPasajero.IMPUESTOS;
                lstPasajeros.Add(objReservaPasajero);
            }
            for (int intX = 1; intX <= objBusquedaVuelo.Infantes; intX++)
            {
                ReservaPasajero objReservaPasajero = new ReservaPasajero();
                objReservaPasajero.PAX_TIPO = "I";
                objReservaPasajero.TARIFA = objVueloSeleccionado.TarifaInfante;
                objReservaPasajero.IMPUESTOS = objVueloSeleccionado.Impuestos;
                decTotalPagar += objReservaPasajero.TARIFA + objReservaPasajero.IMPUESTOS;
                lstPasajeros.Add(objReservaPasajero);
            }

            objReservaVuelo.FEC_SALIDA = objVueloSeleccionado.FechaSalida;
            if (objVueloSeleccionado.FechaRetorno.HasValue) {
                objReservaVuelo.FEC_REGRESO = objVueloSeleccionado.FechaRetorno.Value;            
            }
            objReservaVuelo.CIU_ID_ORIGEN = objVueloSeleccionado.CodigoOrigen;
            objReservaVuelo.CIU_ID_DESTINO = objVueloSeleccionado.CodigoDestino;
            objReservaVuelo.VUELO_MONTO_PAGO = decTotalPagar;
            objReservaVuelo.Pasajeros = lstPasajeros;
            objReservaVuelo.Segmentos = lstSegmentos;

            Session["RESERVA_VUELO"] = objReservaVuelo;

            return View("Reserva", objReservaVuelo);
        }

        public ActionResult Reserva()
        {
            ReservaVuelo reservaInicial = new ReservaVuelo();  
            return View(reservaInicial);
        }

        public ActionResult Reservado()
        {
            return View();
        }

        private bool IsDate(String pStrFecha){
            bool bolResultado = true;
            DateTime datFecTmp;
            try{
                datFecTmp=DateTime.Parse(pStrFecha);
            }
            catch(Exception ex){
                bolResultado = false;
            }
            return bolResultado;
        }
    }
}
